package main

import "fmt"

func NumberOf1(n int) int {
	var arr [31]int
	for i := 0; i < len(arr); i++ {
		if i == 0 {
			arr[i] = 1
		} else {
			arr[i] = 2 * arr[i-1]
		}
	}

	var binArr [32]int

	if n == 0 {
		return 0
	} else if n > 0 {
		max := 0
		for i := 0; i < len(arr); i++ {
			max += arr[i]
		}
		binArr[31] = 0
		if n <= max {
			for i := len(binArr) - 2; i >= 0; i-- {
				if n >= arr[i] && n != 0 {
					binArr[i] = 1
				} else {
					binArr[i] = 0
				}
			}
		}
	} else if n < 0 {
		min := 0
		for i := 0; i < len(arr); i++ {
			min -= arr[i]
		}
		binArr[31] = 1
		if n >= min {
			n = -n
			for i := len(binArr) - 2; i >= 0; i-- {
				if n >= arr[i] && n != 0 {
					binArr[i] = 1
				} else {
					binArr[i] = 0
				}
			}
			// 反码
			for i := 0; i < len(binArr)-1; i++ {
				if binArr[i] == 0 {
					binArr[i] = 1
				} else if binArr[i] == 1 {
					binArr[i] = 0
				}
			}
			// 补码
			for i := 0; i < len(binArr); i++ {
				if binArr[i] == 0 {
					binArr[i] = 1
					break
				} else if binArr[i] == 1 {
					binArr[i] = 0
				}
			}
		}
	}

	cnt := 0
	for i := 0; i < len(binArr); i++ {
		if binArr[i] == 1 {
			cnt++
		}
	}

	return cnt
}

func main() {
	cnt := NumberOf1(-1)
	fmt.Println(cnt)
}
